/**
 * @description 微博 view 路由
 * @author malin
 */

const router = require('koa-router')()
const { loginRedirect } = require('../../middlewares/loginChecks')
const { getProfileBlogList } = require('../../controller/blog-profile')
const { getSquareList } = require('../../controller/blog-square')
const { getFans, getFollowers } = require('../../controller/user-relation')
const { isExist } = require('../../controller/user')
const { getHomeBlogList } = require('../../controller/blog-home')
const { getAtMeCount, getAtMeBlogList, markAsRead } = require('../../controller/blog-at')

// 首页
router.get('/', loginRedirect, async (ctx, next) => {
    const userInfo = ctx.session.userInfo

    // 当前登录用户的id
    const { id: userId } = userInfo

    // 获取第一页数据(controller)
    const result = await getHomeBlogList(userId)
    const { isEmpty, blogList, pageSize, pageIndex, count } = result.data

    // 获取当前登录用户粉丝
    const fansResult = await getFans(userId)
    const { count: fansCount, fansList } = fansResult.data

    // 获取当前登录用户关注的人列表
    const followersResult = await getFollowers(userId)
    const { count: followersCount, followersList } = followersResult.data
    
    // 获取@我的数量
    const atCountResult = await getAtMeCount(userId)
    const { count: atCount } = atCountResult.data

    await ctx.render('index', {
        userData: {
            userInfo,
            fansData: {
                count: fansCount,
                list: fansList
            },
            followersData: {
                count: followersCount,
                list: followersList
            },
            atCount
        },
        blogData: { 
            isEmpty,
            blogList, 
            pageSize, 
            pageIndex, 
            count 
        }
    })
})

// 个人主页
router.get('/profile', loginRedirect, async (ctx, next) => {
    const { userName } = ctx.session.userInfo
    // 只访问profile，默认跳向自己的个人主页
    ctx.redirect(`/profile/${userName}`)
})
router.get('/profile/:userName', loginRedirect, async (ctx, next) => {

    // 已登录用户的信息
    const myUserInfo = ctx.session.userInfo
    const myUserName = myUserInfo.userName

    // 当前主页显示的用户信息
    let currUserInfo
    const { userName: currUserName } = ctx.params

    const isMe = myUserName === currUserName
    if(isMe) {
        // 是当前已登录的用户
        currUserInfo = myUserInfo
    } else {
        // 不是当前登录的用户，那就查看这个用户名是否存在
        const existResult = await isExist(currUserName)
        if(existResult.code) {
            // 用户名不存在
            return
        }
        // 用户名存在
        currUserInfo = existResult.data
    }

    // 获取微博第一页数据 controller，controller返回的都是ResModel类型
    const result = await getProfileBlogList(currUserName, 0)
    const { isEmpty, blogList, pageSize, pageIndex, count } = result.data

    // 获取当前用户粉丝（controller）
    const fansResult = await getFans(currUserInfo.id)
    const { count: fansCount, fansList } = fansResult.data
    // 我是否关注了此人（判断粉丝列表中是否有我）
    const amIFollowed = fansList.some(item => item.userName === myUserName)

    // 获取关注人列表（controller）
    const followersResult = await getFollowers(currUserInfo.id)
    const { count: followersCount, followersList } = followersResult.data

    // 获取@我的数量
    const atCountResult = await getAtMeCount(myUserInfo.id)
    const { count: atCount } = atCountResult.data
    
    await ctx.render('profile', {
        blogData: {
            isEmpty,
            blogList,
            pageSize,
            pageIndex,
            count
        },
        userData: {
            userInfo: currUserInfo,
            isMe,
            fansData: {
                count: fansCount,
                list: fansList
            },
            followersData: {
                count: followersCount,
                list: followersList
            },
            amIFollowed,
            atCount
        }
    })
})

// 广场页路由
router.get('/square', loginRedirect, async (ctx, next) => {
    // 获取微博数据，第一页（controller）
    const result = await getSquareList(0)
    const { isEmpty, blogList, pageSize, pageIndex, count } = result.data
    await ctx.render('square', {
        blogData: {
            isEmpty,
            blogList,
            pageSize,
            pageIndex,
            count
        }
    })
})

// atMe路由
router.get('/at-me', loginRedirect, async (ctx, next) => {
    const { id: userId } = ctx.session.userInfo

    // 获取@数量
    const atCountResult = await getAtMeCount(userId)
    const { count: atCount } = atCountResult.data

    // 获取第一页列表
    const result = await getAtMeBlogList(userId)
    const { isEmpty, blogList, pageIndex, pageSize, count } = result.data
    // 渲染页面
    await ctx.render('atMe', {
        atCount,
        blogData: { 
            isEmpty, 
            blogList, 
            pageIndex, 
            pageSize, 
            count 
        }
    })

    // 标记为已读（先渲染再已读，优化前端体验）
    if(atCount > 0) {
        // 即用户进入页面查看有几个未读消息时，后台默默的全部设置为已读
        // 逻辑有点粗，不精准
        await markAsRead(userId)
    }
})

module.exports = router
